﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SegIdenPC.Entidad;
using SegIdenPC.Herramientas;
using log4net;
using GS1.Utilitario;
using System.Drawing.Imaging;
using System.Configuration;
using ExcelLibrary.CompoundDocumentFormat;
using ExcelLibrary.BinaryDrawingFormat;
using ExcelLibrary.BinaryFileFormat;
using ExcelLibrary.SpreadSheet;

namespace SegIdenPC.Formularios
{
    public partial class frmReportes : Form
    {
        #region --- Variables y Propiedades ---
        private static readonly ILog log = LogManager.GetLogger(typeof(frmReportes));

        private const string LLAVE_RUTAIMAGEN = "RUTAIMAGEN";

        private const string TITULO = "Reportes";
        private const string FORMATO_TOTAL_ENCONTRADOS = "Total productos encontrados: {0}";

        private const string FILTRO_VENTANA_EXAMINAR = "Archivos Imagen (*.jpg)|*.jpg";
        private const string TITULO_EXAMINAR_ARCHIVO_IMAGEN = "Seleccione su archivo de Imagen";
        private string RUTA_INICIAL = ConfigurationManager.AppSettings[LLAVE_RUTAIMAGEN];

        

        private const string FORMATO_PRODUCTO_DESCRIPCION_DETALLADA = "{0} - {1} - {2} - {3}";


        private Tienda tiendaSolicitud = null;
        private Producto productoSolicitud = null;
        private Cliente clienteSolicitud = null;
        private Diseniador diseniadorSolicitud = null;
        private Proveedor proveedorSolicitud = null;
        private ListaPais paises = null;

        public bool formularioBusqueda { get; set; }
        #endregion

        #region --- Constructor ---
        public frmReportes()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos Formulario ---
        private void frmReportes_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }

        private void btnReporteInventario_Click(object sender, EventArgs e)
        {
            enviaReporteInventario();
        }

        private void btnBuscarTiendaO_Click(object sender, EventArgs e)
        {
            elegirTienda();
        }

        private void btnBuscarProducto_Click(object sender, EventArgs e)
        {
            elegirProducto();
        }

        private void btnBuscarCliente_Click(object sender, EventArgs e)
        {
            elegirCliente();
        }

        private void cboTipoDocumento_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.cboTipoDocumento.Focused) { limpiarDatosCliente(); }
        }

        private void btnBuscarDecorador_Click(object sender, EventArgs e)
        {
            elegirDecorador();
        }

        private void btnBuscarProveedor_Click(object sender, EventArgs e)
        {
            elegirProveedor();
        }
        #endregion

        #region --- Metodos Propios ---

        private void cargarFormulario()
        {
            ListaGeneral listaReporte = null;
            ListaGeneral listaTipoDocumento = null;
            ListaGeneral listaTipoProveedor = null;
            ListaPais listaPais = null;

            try
            {
                Cursor.Current = Cursors.WaitCursor;

                // Instanciando y creando listado de estado
                listaReporte = new ListaGeneral();
                listaReporte.Add(new General { codigo = "0", descripcion = "---Seleccione---" });
                listaReporte.Add(new General { codigo = Constantes.REPORTE_INVENTARIO_TIENDA, descripcion = Constantes.REPORTE_DESCRIPCION_INVENTARIO_TIENDA });
                listaReporte.Add(new General { codigo = Constantes.REPORTE_INVENTARIO_VALORIZADO_TIENDA, descripcion = Constantes.REPORTE_DESCRIPCION_INVENTARIO_VALORIZADO_TIENDA });
                listaReporte.Add(new General { codigo = Constantes.REPORTE_VENTAXFECHA, descripcion = Constantes.REPORTE_DESCRIPCION_VENTAXFECHA });
                listaReporte.Add(new General { codigo = Constantes.REPORTE_VENTAXPRODUCTO, descripcion = Constantes.REPORTE_DESCRIPCION_VENTAXPRODUCTO });
                listaReporte.Add(new General { codigo = Constantes.REPORTE_VENTAXCLIENTE, descripcion = Constantes.REPORTE_DESCRIPCION_VENTAXCLIENTE });
                listaReporte.Add(new General { codigo = Constantes.REPORTE_VENTAXDECORADOR, descripcion = Constantes.REPORTE_DESCRIPCION_VENTAXDECORADOR });
                listaReporte.Add(new General { codigo = Constantes.REPORTE_PRODUCTOXORIGEN, descripcion = Constantes.REPORTE_DESCRIPCION_PRODUCTOXORIGEN });
                listaReporte.Add(new General { codigo = Constantes.REPORTE_PRODUCTOXPROVEEDOR, descripcion = Constantes.REPORTE_DESCRIPCION_PRODUCTOXPROVEEDOR });
                listaReporte.Add(new General { codigo = Constantes.REPORTE_DESPACHOSXTIENDA, descripcion = Constantes.REPORTE_DESCRIPCION_DESPACHOSXTIENDA });
                listaReporte.Add(new General { codigo = Constantes.REPORTE_CONTENIDOGUIA, descripcion = Constantes.REPORTE_DESCRIPCION_CONTENIDOGUIA });
                listaReporte.Add(new General { codigo = Constantes.REPORTE_PRESTAMOSXTIENDA, descripcion = Constantes.REPORTE_DESCRIPCION_PRESTAMOSXTIENDA });
                listaReporte.Add(new General { codigo = Constantes.REPORTE_PROVEEDORXPAIS, descripcion = Constantes.REPORTE_DESCRIPCION_PROVEEDORXPAIS });
                listaReporte.Add(new General { codigo = Constantes.REPORTE_CONTENIDOFACTURA, descripcion = Constantes.REPORTE_DESCRIPCION_CONTENIDOFACTURA });

                //poblando lista de reportes
                this.cboReportes.DataSource = listaReporte;
                this.cboReportes.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboReportes.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboReportes.SelectedIndex = 0;

                // Instanciando y creando listado de documentos
                listaTipoDocumento = new ListaGeneral();
                listaTipoDocumento.Add(new General { codigo = Constantes.CODIGO_TIPO_DOCUMENTO_DNI, descripcion = Constantes.DESCRIPCION_TIPO_DOCUMENTO_DNI });
                listaTipoDocumento.Add(new General { codigo = Constantes.CODIGO_TIPO_DOCUMENTO_RUC, descripcion = Constantes.DESCRIPCION_TIPO_DOCUMENTO_RUC });
                listaTipoDocumento.Add(new General { codigo = Constantes.CODIGO_TIPO_DOCUMENTO_CE, descripcion = Constantes.DESCRIPCION_TIPO_DOCUMENTO_CE });
                listaTipoDocumento.Add(new General { codigo = Constantes.CODIGO_TIPO_DOCUMENTO_CI, descripcion = Constantes.DESCRIPCION_TIPO_DOCUMENTO_CI });

                // Estableciendo parametros del combo Tipo documento
                this.cboTipoDocumento.DataSource = listaTipoDocumento;
                this.cboTipoDocumento.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboTipoDocumento.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboTipoDocumento.SelectedIndex = 0;

                // Instanciando y creando listado de documentos
                listaTipoProveedor = new ListaGeneral();
                listaTipoProveedor.Add(new General { codigo = Constantes.CODIGO_TIPO_PROVEEDOR_NACIONAL, descripcion = Constantes.DESCRIPCION_TIPO_PROVEEDOR_NACIONAL });
                listaTipoProveedor.Add(new General { codigo = Constantes.CODIGO_TIPO_PROVEEDOR_EXTRANJERO, descripcion = Constantes.DESCRIPCION_TIPO_PROVEEDOR_EXTRANJERO });

                // Estableciendo parametros del combo Tipo proveedor
                this.cboTipoProveedor.DataSource = listaTipoProveedor;
                this.cboTipoProveedor.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboTipoProveedor.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboTipoProveedor.SelectedIndex = 0;

                //Instanciando y creando listado de país
                listaPais = new ListaPais();

                cargarPaises();
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private void elegirTienda()
        {
            using (frmMantTienda frmMantTienda = new frmMantTienda())
            {
                frmMantTienda.formularioBusqueda = true;
                if (frmMantTienda.ShowDialog() == DialogResult.Cancel) { return; }

                this.tiendaSolicitud = frmMantTienda.tiendaActual;
                this.txtTiendaOCodigo.Text = this.tiendaSolicitud.codigo;
                this.txtTiendaODescripcion.Text = this.tiendaSolicitud.nombre;
            }
        }

        private void elegirProducto()
        {
            using (frmMantProducto frmMantProducto = new frmMantProducto())
            {
                frmMantProducto.formularioBusqueda = true;
                if (frmMantProducto.ShowDialog() == DialogResult.Cancel) { return; }

                this.productoSolicitud = frmMantProducto.productoActual;

                // Cargar datos del producto
                obtenerProductoDetalle();
            }
        }

        private void elegirCliente()
        {
            using (frmMantCliente frmMantCliente = new frmMantCliente())
            {
                frmMantCliente.formularioBusqueda = true;
                if (frmMantCliente.ShowDialog() == DialogResult.Cancel) { return; }

                this.clienteSolicitud = frmMantCliente.clienteActual;
                this.cboTipoDocumento.Text = this.clienteSolicitud.tipoDocumento;
                this.txtClienteNroDocumento.Text = this.clienteSolicitud.nroDocumento;
                this.txtClienteRazonSocial.Text = this.clienteSolicitud.razonSocial;
            }

        }

        private void elegirDecorador()
        {
            using (frmMantDecorador frmMantDecorador = new frmMantDecorador())
            {
                frmMantDecorador.formularioBusqueda = true;
                if (frmMantDecorador.ShowDialog() == DialogResult.Cancel) { return; }

                this.diseniadorSolicitud = frmMantDecorador.diseniadorActual;
                this.txtDecoradorCodigo.Text = this.diseniadorSolicitud.codDiseniador;
                this.txtDecoradorDescripcion.Text = this.diseniadorSolicitud.nombresyApellidos;
            }
        }

        private void elegirProveedor()
        {
            using (frmMantProveedor frmMantProveedor = new frmMantProveedor())
            {
                frmMantProveedor.formularioBusqueda = true;
                if (frmMantProveedor.ShowDialog() == DialogResult.Cancel) { return; }

                this.proveedorSolicitud = frmMantProveedor.proveedorActual;
                this.txtDesProveedor.Text = this.proveedorSolicitud.razonSocial;
            }
        }

        private void cargarPaises()
        {
            {
                Operacion operacion = null;
                string contenidoXML = string.Empty;

                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_LISTAR_PAIS;

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                // Obteniendo Objeto de ListaPais (Paises)
                this.paises = contenidoXML.DeserializarTo<ListaPais>();

                // Estableciendo listado de paises
                this.cboPaisProveedor.DataSource = this.paises.lista;
                this.cboPaisProveedor.ValueMember = "codPais";
                this.cboPaisProveedor.DisplayMember = "desPais";
                this.cboPaisProveedor.SelectedIndex = 0;

                // Creando listado para registro de pais
                ListaPais listaPais = new ListaPais();
                //listaPais.add(new Pais { codPais = Constantes.CODIGO_SELECCIONE, desPais = Constantes.DESCRIPCION_SELECCIONE });

                foreach (Pais pais in this.paises.lista)
                {
                    listaPais.add(new Pais { codPais = pais.codPais, desPais = pais.desPais });
                }
            }
        }

        private void obtenerProductoDetalle()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_OBTENER_PRODUCTO;
                operacion.producto = new Producto { codigo = this.productoSolicitud.codigo };
                operacion.tienda = new Tienda();
                operacion.tienda = ParametrosAplicacion.TIENDA_ACTUAL;

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                // Obteniendo Objeto de Producto
                Producto producto = contenidoXML.DeserializarTo<Producto>();
                productoSolicitud = producto;

                // Mostrar los datos del producto
                this.txtProductoCodigo.Text = producto.codigo;
                this.txtProductoDescripcion.Text = string.Format(FORMATO_PRODUCTO_DESCRIPCION_DETALLADA, producto.nivelProducto.descripcion,
                                                                                                         producto.nivelTipo.descripcion,
                                                                                                         producto.nivelMaterial.descripcion,
                                                                                                         producto.nivelColor.descripcion);
                
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private void limpiarDatosCliente()
        {
            // Limpiando datos del cliente anterior
            this.txtClienteRazonSocial.Text = string.Empty;
        }

        private void enviaReporteInventario()
        {
            Inventario inventario = new Inventario();

            inventario.codInventario = "1";
            
            inventario.tienda = new Tienda();
            inventario.tienda.codigo = "3";

            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_OBTENER_REPORTE_INVENTARIO;
            operacion.inventario = inventario;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de ReporteInventario
            ReporteInventario reporteInventario = contenidoXML.DeserializarTo<ReporteInventario>();

            string file = "C:\\temp\\newdoc.xls";
            Workbook workbook = new Workbook();
            Worksheet worksheet = new Worksheet("Reporte Inventarios");

            worksheet.Cells[0, 0] = new Cell("Nombre Local");
            worksheet.Cells[0, 1] = new Cell(reporteInventario.inventario.tienda.descripcion);

            //worksheet.Cells[1, 0] = new Cell("Fecha del Inventario");
           // worksheet.Cells[1, 1] = new Cell(reporteInventario.inventario.fechaInicio.ToString());

            worksheet.Cells[2, 0] = new Cell("Estado del Inventario");
            worksheet.Cells[2, 1] = new Cell(0);

            worksheet.Cells[4, 0] = new Cell("Código Producto");
            worksheet.Cells[4, 1] = new Cell("Descripción del Producto");
            worksheet.Cells[4, 2] = new Cell("Precio");
            worksheet.Cells[4, 3] = new Cell("Cantidad Según sistema");
            worksheet.Cells[4, 4] = new Cell("Cantidad Inventariada");

            int i = 5;
            foreach (LineaReporteInventario lineaReporteInventario in reporteInventario.listaLineaReporteInventario.lista)
            {

                worksheet.Cells[i, 0] = new Cell(lineaReporteInventario.producto.codigo);
                worksheet.Cells[i, 1] = new Cell(lineaReporteInventario.producto.descripcion);
                worksheet.Cells[i, 2] = new Cell(lineaReporteInventario.producto.precioVentaMaximo);
                worksheet.Cells[i, 3] = new Cell(lineaReporteInventario.stockSistema);
                worksheet.Cells[i, 4] = new Cell(lineaReporteInventario.stockInventario);

                //if (lineaReporteInventario.producto.imagen.Equals("")) { }
                //else {
                //    lineaReporteInventario.producto.imagen.base64ToImage().Save("C:\\temp\\" + i.ToString() + ".jpg");
                //    Picture pic = new Picture();
                //    pic.Image = ExcelLibrary.SpreadSheet.Image.FromFile("C:\\temp\\" + i.ToString() + ".jpg");
                //    pic.TopLeftCorner = new CellAnchor(5, Convert.ToUInt16(i + 1), 0, 0);
                //    pic.BottomRightCorner = new CellAnchor(12, Convert.ToUInt16(i + 5), 592, 243);
                //    worksheet.AddPicture(pic);
                //}
                i++;
            }
            workbook.Worksheets.Add(worksheet);
            workbook.Save(file);

        }

        #endregion
    }
}
